/**
 * RSA 加密工具模块
 * 提供密码加密功能，使用 RSA 公钥加密算法确保数据传输安全
 * 主要用于用户登录时对密码进行加密，防止明文传输
 */

// 导入 JSEncrypt 库，这是一个用于 RSA 加密的 JavaScript 库
// 支持标准的 RSA 加密/解密操作，使用简单且功能完整
import JSEncrypt from 'jsencrypt'

/**
 * RSA 公钥常量
 * 用于加密用户密码的公钥，采用标准的 PEM 格式
 * 
 * 格式说明：
 * - -----BEGIN PUBLIC KEY----- 和 -----END PUBLIC KEY----- 是 PEM 格式的标准标记
 * - 中间的字符串是 Base64 编码的公钥数据
 * - 这个公钥与后端的私钥配对，用于非对称加密
 * 
 * 安全说明：
 * - 公钥可以公开，用于加密数据
 * - 只有持有对应私钥的服务器才能解密数据
 * - 确保密码在传输过程中不会被窃取
 */
const publicKey = `-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCuQd3gESx7VdIyRYUWjmjg61VIgUK6F45hClmqUMZ7xNiT5rlLM6e78osMvBF/yP7cVm7pK+NMCDWoVS1/AETpxJYqUlIC77ZAU8/MnP96IupnJL87vqhPcpdv7+VqLM38ls++yuD/F/HSoOQTv/leJh+dgE/4EYAJjOWFAbYfXwIDAQAB
-----END PUBLIC KEY-----`

/**
 * 密码加密函数
 * 使用 RSA 公钥对明文密码进行加密，确保密码在传输过程中的安全性
 * 
 * 加密流程：
 * 1. 检查公钥是否存在
 * 2. 创建 JSEncrypt 实例
 * 3. 设置公钥
 * 4. 执行加密操作
 * 5. 验证加密结果
 * 
 * @param plain 明文密码，用户输入的原始密码
 * @returns 加密后的密码字符串，Base64 编码格式
 * @throws {Error} 当公钥不存在或加密失败时抛出错误
 * 
 * 使用示例：
 * ```typescript
 * const encryptedPassword = encryptPassword('userPassword123')
 * // 返回加密后的字符串，可以直接发送到服务器
 * ```
 * 
 * 安全特性：
 * - 使用 RSA 非对称加密算法
 * - 每次加密结果都不同（由于随机填充）
 * - 即使相同的明文，每次加密后的密文也不同
 * - 只有服务器持有私钥才能解密
 */
export const encryptPassword = (plain: string): string => {
	// 检查公钥是否存在，如果不存在则抛出错误
	// 这是一个安全检查，确保加密功能可以正常工作
	if (!publicKey) {
		throw new Error('MISSING_RSA_PUBLIC_KEY')
	}
	
	// 创建 JSEncrypt 实例，用于执行 RSA 加密操作
	// JSEncrypt 是一个轻量级的 RSA 加密库，专门用于浏览器环境
	const crypt = new JSEncrypt()
	
	// 设置公钥，告诉加密器使用哪个公钥进行加密
	// 公钥必须是标准的 PEM 格式
	crypt.setPublicKey(publicKey)
	
	// 执行加密操作，将明文密码转换为密文
	// 加密过程使用 RSA 算法和随机填充，确保安全性
	const cipher = crypt.encrypt(plain)
	
	// 检查加密是否成功，如果失败则抛出错误
	// 加密失败可能是由于公钥格式错误或其他技术问题
	if (!cipher) {
		throw new Error('RSA_ENCRYPTION_FAILED')
	}
	
	// 返回加密后的密码字符串
	// 这个字符串可以直接发送到服务器，服务器使用私钥解密
	return cipher
}


